home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 July / EnigmA AMIGA RUN 29 (1998)(G.R. Edizioni)(IT)[!][issue 1998-07 & 08].iso / earkit / news / thor / rexx / getnet.thor < prev    next >
Text File  |  1998-05-24  |  42KB  |  1,465 lines

  1. /*
  2.   $VER: GetNET.Thor 2.3b2 (3.12.96)
  3.   by Remco van Hooff
  4.  
  5.   See GetNET.guide for installation and usage.
  6.  
  7.   No need to edit anything in this script.
  8. */
  9.  
  10. /*!~ "CHANGES IN 2.3"*/
  11. /*!~ "2.3b1"
  12.  - Added URL parsing for the new http button support in Thor.
  13.    Use http.thor to parse the url on to GetNET.
  14. ~!*/
  15. /*!~ "2.3b2"
  16.  - Forgot to remove some debug output.
  17. ~!*/
  18. /*~!*/
  19.  
  20. /*!~ "TO DO"
  21. Short term:
  22.   - add the new user database options to GetEmail.
  23.  
  24. Long term:
  25.  - Rewrite the code layout.
  26.  - Scan selected msgs in one go instead of 1 by 1.
  27.    Note: scan msgs for subject and fromname (more arrays; each msg), save msgs
  28.    to 1 file (add dimention to found/save/name arrays -> difficulty showing all
  29.    in 1 listview: can't show arrays with more than 1 dimention, putting them in
  30.    a special array will lose the msg number info needed for subject/fromname).
  31.    => DIFFICULT!
  32.  - Scanning for FTP and HTTP at once.
  33.    Note: put each line through GetHTTP and GetFTP -> different function calling
  34.    scheme.
  35.  - Hotlist support for other FTP/WWW programs (HOTLIST INFO NEEDED!!!)
  36.  - Show the msg/file that is being scanned in msgwindow (optional), I've
  37.    already tried it but it's just no good when you can't scroll the window when
  38.    an ARexx requester is open :./
  39.    HOW ABOUT ALLOWING TO SCROLL, THOR TEAM???
  40. ~!*/
  41.  
  42. /*---------------------------------------------------------------------------*/
  43.  
  44. /*!~ "Variables" */
  45. /*!~ "Filters" */
  46. /* don't edit these */
  47. cr = '0d'x
  48. lf = '0a'x
  49. tab= '09'x
  50.  
  51. /*!~ "trailing filter" */
  52. /* do not use '/' here! */
  53. filter.1.1 = cr
  54. filter.1.2 = lf
  55. filter.1.3 = ')'
  56. filter.1.4 = ','
  57. filter.1.5 = "'"
  58. filter.1.6 = '"'
  59. filter.1.7 = ']'
  60. filter.1.8 = '>'
  61. filter.1.9 = '}'
  62. filter.1.10 = '*'
  63. filter.1.11 = ';' 
  64. filter.1.12 = '`'
  65. filter.1.count = 11 /* number of filters */
  66. /*~!*/
  67.  
  68. /*!~ "preceeding filter" */
  69. filter.2.1 = '('
  70. filter.2.2 = '"'
  71. filter.2.3 = '<'
  72. filter.2.4 = '['
  73. filter.2.5 = '{'
  74. filter.2.6 = ':'
  75. filter.2.7 = "'"
  76. filter.2.8 = tab
  77. filter.2.9 = '/'
  78. filter.2.10 = '|'
  79. filter.2.11 = '`'
  80. filter.2.count = 11
  81. /*~!*/
  82.  
  83. /*!~ "filetypes" */
  84. /* for recognition of files in ftp URLs */
  85. /* UPPERCASE */
  86. filetype.1  = '.LZH'
  87. filetype.2  = '.LHA'
  88. filetype.3  = '.LZX'
  89. filetype.4  = '.ZIP'
  90. filetype.5  = '.GZIP'
  91. filetype.6  = '.Z'
  92. filetype.7  = '.GZ'
  93. filetype.8  = '.TAR'
  94. filetype.9  = '.TXT'
  95. filetype.10 = '.FAQ'
  96. filetype.11 = '.README'
  97. filetype.count = 11
  98. /*~!*/
  99. /*~!*/
  100.  
  101. /*!~ "Constants" */
  102. cfgpath = 'env:thor/'
  103. cfgfile = 'getnet.config'
  104.  
  105. version = SUBWORD(SOURCELINE(2), 3,1)
  106. maintitle = 'GetNET' version '© by Remco van Hooff'
  107. tempfile = 't:temp.tmp'
  108.  
  109. EVE_DOWNLOAD     =  4
  110.  
  111. extra    = 1 
  112.  
  113. reqfile   = 0
  114. scanhttp  = 0
  115. scanftp   = 0
  116. scanemail = 0
  117.  
  118. domains = '.EDU.ORG.COM.NET.GOV.MIL.AA.AD.AE.AF.AG.AL.AM.AO.AR.AT.AU.AZ.BA.BB.',
  119.           '.BD.BE.BF.BG.BH.BI.BJ.BM.BN.BO.BR.BS.BT.BW.BY.BZ.CA.CF.CG.CH.CI.CL.',
  120.           '.CM.CN.CO.CR.CU.CV.CY.CZ.DE.DJ.DK.DM.DO.DZ.EC.EE.EG.EP.ES.ET.FI.FJ.',
  121.           '.FR.GA.GB.GD.GE.GH.GM.GN.GQ.GR.GT.GU.GW.GY.HK.HN.HR.HT.HU.ID.IE.IL.',
  122.           '.IN.IQ.IR.IS.IT.JM.JO.JP.KE.KG.KH.KI.KM.KP.KR.KW.KZ.LA.LB.LC.LI.LK.',
  123.           '.LR.LS.LT.LU.LV.LY.MA.MC.MD.MG.ML.MM.MN.MR.MT.MU.MV.MW.MX.MY.MZ.NA.',
  124.           '.NE.NG.NI.NL.NO.NP.NR.NZ.OM.PA.PE.PG.PH.PK.PL.PR.PT.PY.QA.QS.QZ.RO.',
  125.           '.RU.RW.SA.SB.SC.SD.SE.SG.SI.SK.SL.SM.SN.SO.SR.ST.SV.SY.SZ.TD.TG.TH.',
  126.           '.TJ.TM.TN.TO.TR.TT.TV.TW.TZ.UA.UG.UK.US.UY.UZ.VA.VC.VE.VN.VU.WO.WS.',
  127.           '.XA.XC.XD.XE.XF.XH.XI.XJ.XK.XN.XO.XR.XS.XT.XU.XW.XX.XY.XZ.YE.YU.ZA.',
  128.           '.ZM.ZR.ZW.ZZ.INT.'
  129.  
  130. /*---------------------------------------------------------------------------*/
  131.  
  132. /*~!*/
  133. /*~!*/
  134.  
  135. /*!~ "Init" */
  136. ftpsavemode = Upper(ftpsavemode)
  137.  
  138. OPTIONS RESULTS
  139. OPTIONS FAILAT 31
  140. SIGNAL ON HALT
  141. SIGNAL ON SYNTAX
  142. /*TRACE RESULTS*/
  143.  
  144. p=' '||ADDRESS()||' '||SHOW('P',,)
  145. IF POS(' THOR.',p)>0 THEN thorport=WORD(SUBSTR(p,POS(' THOR.',p)+1),1)
  146. ELSE DO
  147.   SAY 'THOR port not found!'
  148.   EXIT 10
  149. END
  150.  
  151. IF ~SHOW('p', 'BBSREAD') THEN DO
  152.   ADDRESS COMMAND
  153.     "run >nil: `GetEnv THOR/THORPath`bin/LoadBBSRead"
  154.     "WaitForPort BBSREAD"
  155. END
  156.  
  157. IF ~SHOW('L','rexxsupport.library') THEN CALL ADDLIB('rexxsupport.library',0,-30,0)
  158. IF ~SHOW('L','rexxsupport.library') THEN DO
  159.   'REQUESTNOTIFY TEXT "Couldn''t open rexxsupport.library" BT "_Ok"'
  160.   EXIT
  161. END
  162. /*~!*/
  163.  
  164. /*!~ "Main loop" */
  165. PARSE ARG arguments
  166. template = 'URL/K,REQ/S'
  167.  
  168. IF arguments = '?' THEN DO
  169.   SAY 'Usage:' template
  170.   EXIT
  171. END
  172.  
  173. ADDRESS(bbsread)
  174. 'READARGS "'template'" 'args' CMDLINE 'arguments
  175. IF RC ~= 0 THEN DO
  176.   SAY BBSREAD.LASTERROR
  177.   SAY 'Template: 'template
  178.   EXIT
  179. END
  180.  
  181. ADDRESS(thorport)
  182.  
  183. CALL loadprefs
  184. pro_http = amosaic+aweb+ibrowse+voyager+html+tcpdl
  185. pro_ftp  = ncftp+dopus+guiftp+amftp
  186.  
  187. IF args.REQ = 1 THEN req = REQ
  188. ELSE req = ''
  189. IF (args.URL ~= '' & args.URL ~= 'ARGS.URL') THEN CALL handle_url(args.URL)
  190. IF askfr = 1 THEN CALL askreq
  191. IF upper(req) = 'REQ' THEN CALL request_file
  192. IF reqfile = 0 THEN CALL getmsg_selected
  193. CALL cleanup
  194. EXIT
  195. /*~!*/
  196.  
  197. /*!~ "Msg handling" */
  198. /*!~ "getmsg_selected" */
  199. getmsg_selected:
  200.   'GETMSGLISTSELECTED STEM' sel
  201.   SELECT
  202.     WHEN (RC = 30) THEN DO
  203.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  204.       CALL cleanup
  205.     END
  206.     WHEN ((RC = 3) | (RC = 5)) THEN DO
  207.       CALL current_msg
  208.       CALL msg_info
  209.       CALL main
  210.     END
  211.     OTHERWISE DO
  212.       'CURRENTSYSTEM SYS'
  213.       IF RC = 30 THEN DO
  214.         'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  215.         CALL cleanup
  216.       END
  217.       IF RC = 1 THEN DO
  218.         'REQUESTNOTIFY TEXT "No open system!" BT "_Ok"'
  219.         CALL cleanup
  220.       END
  221.       curbbs  = SYS.BBSNAME
  222.       curconf = SYS.CONFNAME
  223.       'OPENPROGRESS TITLE "'maintitle'" TOTAL' sel.count 'AT "_Abort" PT "Scanning messages (0/'sel.count')"'
  224.       IF(RC ~= 0) THEN DO
  225.         'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  226.         CALL cleanup
  227.       END
  228.       ELSE progressid1 = RESULT
  229.  
  230.       DO multi = 1 TO sel.COUNT
  231.         'UPDATEPROGRESS REQ' progressid1 'CURRENT' multi 'PT "Scanning messages ('multi'/'sel.count')"'
  232.         IF RC = 5 THEN CALL cleanup 
  233.         IF(RC = 30) THEN DO
  234.           'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  235.           CALL cleanup
  236.         END
  237.         msgnum = sel.multi
  238.         CALL msg_info 
  239.         CALL main 
  240.       END
  241.       'CLOSEPROGRESS REQ' progressid1
  242.     END
  243.   END
  244. RETURN
  245. /*~!*/
  246.  
  247. /*!~ "current_msg" */
  248. current_msg:
  249.   'CURRENTMSG stem' MSG
  250.   IF(RC ~= 0) THEN DO
  251.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  252.     CALL cleanup
  253.   END
  254.   msgnum  = MSG.MSGNR
  255.   curbbs  = MSG.BBSNAME
  256.   curconf = MSG.CONFNAME
  257. RETURN
  258. /*~!*/
  259.  
  260. /*!~ "msg_info" */
  261. msg_info:
  262.   ADDRESS bbsread 'READBRMESSAGE BBSNAME "'curbbs'" CONFNAME "'curconf'" MSGNR' msgnum 'HEADSTEM' headtags
  263.   IF(RC ~= 0) THEN DO
  264.     'REQUESTNOTIFY TEXT "'BBSREAD.LASTERROR'" BT "_Ok"'
  265.     CALL cleanup
  266.   END
  267.   fromname = HEADTAGS.FROMNAME
  268.   subj = HEADTAGS.SUBJECT
  269.   IF POS('RE:',UPPER(subj)) ~=0 THEN subj = SUBSTR(subj,5)
  270. RETURN
  271. /*~!*/
  272.  
  273. /*!~ "main" */
  274. main:
  275.   DROP FOUND. SAVE. NAME.
  276.   IF (scanhttp = 0 & scanftp = 0 & scanemail = 0) THEN DO
  277.     'REQUESTNOTIFY TEXT "Select a URL to scan for." BT "_HTTP|_Email|_FTP|_Aminet|_Quit"'
  278.     SELECT
  279.       WHEN RESULT = 1 THEN scanhttp = 1
  280.       WHEN RESULT = 2 THEN scanemail = 1
  281.       WHEN RESULT = 3 THEN scanftp = 1
  282.       WHEN RESULT = 4 THEN scanaminet = 1
  283.       OTHERWISE CALL cleanup
  284.     END
  285.   END  
  286.   SELECT
  287.     WHEN scanhttp = 1 THEN CALL get_http
  288.     WHEN scanemail = 1 THEN CALL get_email
  289.     WHEN scanftp = 1 THEN CALL get_ftp
  290.     WHEN scanaminet = 1 THEN CALL get_aminet
  291.     OTHERWISE NOP
  292.   END
  293. RETURN
  294. /*~!*/
  295. /*~!*/
  296.  
  297. /*!~ "GetHTTP" */
  298. /*!~ "get_http" */
  299. get_http:
  300.   'OPENPROGRESS TITLE "'maintitle'" TOTAL 0 AT "_Abort" PT "Hold on, saving message..."'
  301.   IF(RC ~= 0) THEN DO
  302.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  303.     CALL cleanup
  304.   END
  305.   ELSE progressid = RESULT
  306.   IF reqfile = 0 THEN DO
  307.     'SAVEMESSAGE BBSNAME "'curbbs'" CONFNAME "'curconf'" MSGNR' msgnum 'FILENAME' tempfile 'NOANSI OVERWRITE'
  308.     IF(RC ~= 0) THEN DO
  309.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  310.       CALL cleanup
  311.     END
  312.   END
  313.   CALL gethttp
  314.   CALL listfound
  315.   IF ok = 1 THEN CALL listsave(1)
  316. RETURN
  317. /*~!*/
  318.  
  319. /*!~ "gethttp" */
  320. gethttp:
  321.   opentmp = OPEN(tmp, tempfile, 'R')
  322.   filelngth = SEEK(tmp,0,'E')
  323.   'UPDATEPROGRESS REQ' progressid 'TOTAL' filelngth 'PT "Searching... (0)"'
  324.   IF RC = 5 THEN CALL cleanup 
  325.   IF(RC = 30) THEN DO
  326.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  327.     CALL cleanup
  328.   END
  329.   CALL SEEK(tmp, 0,'B')
  330.   num = 0; found.count = 0; sumadres = ''; curpos = 0
  331.   DO UNTIL curpos = filelngth
  332.     msg = READLN(tmp)
  333.     curpos = SEEK(tmp, 0)
  334.     IF curpos // 10 = 0 THEN 'UPDATEPROGRESS REQ' progressid 'CURRENT' curpos
  335.     IF RC = 5 THEN CALL cleanup
  336.     IF(RC = 30) THEN DO
  337.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  338.       CALL cleanup
  339.     END
  340.     httpadres = ''
  341.     DO FOREVER
  342.       IF ((POS('WWW', UPPER(msg)) ~= 0) & (POS('TTP://', UPPER(msg)) ~= POS('WWW', UPPER(msg)) - 6))  THEN DO
  343.         msg1 = OVERLAY('www', msg, POS('WWW',UPPER(msg)))
  344.         PARSE VAR msg1 . 'www' httpadres rest
  345.         IF httpadres ~= '' THEN httpadres = 'www'||httpadres
  346.       END
  347.       ELSE DO
  348.         IF POS('HTTP://', UPPER(msg)) ~= 0 THEN DO
  349.           msg1 = OVERLAY('http', msg, POS('HTTP://',UPPER(msg)))
  350.           PARSE VAR msg1 . 'http://' httpadres rest
  351.         END
  352.       END
  353.       IF httpadres ~= '' THEN DO
  354.         CALL filter(httpadres,1)
  355.         httpadres = 'http://'||RESULT
  356.         CALL checkdomain(httpadres, 'HTTP')
  357.         PARSE VAR httpadres 'http://' num1 '.' num2 '.' num3 '.' num4
  358.         IF (DATATYPE(num1, 'NUM') & DATATYPE(num2, 'NUM') & DATATYPE(num3, 'NUM') & num4 ~= '') THEN domainOK = 1
  359.         CALL dubbel(httpadres,0)
  360.       END
  361.       IF (POS('HTTP://', UPPER(rest)) ~= 0 | POS('WWW', UPPER(rest)) ~= 0) THEN DO
  362.         msg = rest
  363.         empty = 0
  364.       END 
  365.       ELSE empty = 1
  366.       IF empty = 1 THEN LEAVE
  367.     END
  368.   END
  369.   'CLOSEPROGRESS REQ' progressid
  370.   CALL CLOSE(tmp)
  371.   IF reqfile = 0 THEN DELETE(tempfile)
  372. RETURN
  373. /*~!*/
  374. /*~!*/
  375.  
  376. /*!~ "GetEmail" */
  377. /*!~ "get_email" */
  378. get_email:
  379.   'OPENPROGRESS TITLE "'maintitle'" TOTAL 0 AT "_Abort" PT "Hold on, saving message..."'
  380.   IF(RC ~= 0) THEN DO
  381.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  382.     CALL cleanup
  383.   END
  384.   ELSE progressid = RESULT
  385.   IF reqfile = 0 THEN DO
  386.     'SAVEMESSAGE BBSNAME "'curbbs'" CONFNAME "'curconf'" MSGNR' msgnum 'FILENAME' tempfile 'NOHEADER NOANSI OVERWRITE'
  387.     IF(RC ~= 0) THEN DO
  388.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  389.       CALL cleanup
  390.     END
  391.   END
  392.   CALL getemail
  393.   CALL listfound
  394.   IF ok = 1 THEN CALL listsave(2)
  395. RETURN
  396. /*~!*/
  397.  
  398. /*!~ "getemail" */
  399. getemail:
  400.   opentmp = OPEN(tmp, tempfile, 'r')
  401.   filelngth = SEEK(tmp,0,'E')
  402.   'UPDATEPROGRESS REQ' progressid 'TOTAL' filelngth 'PT "Searching... (0)"'
  403.   IF RC = 5 THEN CALL cleanup 
  404.   IF(RC = 30) THEN DO
  405.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  406.     CALL cleanup
  407.   END
  408.   CALL SEEK(tmp, 0,'B')
  409.   num = 0; found.count = 0; sumadres = ''; curpos = 0
  410.   DO UNTIL curpos = filelngth
  411.     msg = READLN(tmp)
  412.     curpos = SEEK(tmp, 0)
  413.     IF curpos // 10 = 0 THEN 'UPDATEPROGRESS REQ' progressid 'CURRENT' curpos
  414.     IF RC = 5 THEN CALL cleanup
  415.     IF(RC = 30) THEN DO
  416.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  417.       CALL cleanup
  418.     END
  419.     PARSE VAR msg part1 '@' part2 '.' part3 rest
  420.     DO FOREVER
  421.       IF (part2 ~= '' & POS(' ',part2) = 0 & part3 ~= '') THEN DO
  422.         spc = LASTPOS(' ', part1)
  423.         IF spc ~= 0 THEN part1 = DELSTR(part1, 1, spc)
  424.         CALL filter(part1,2)
  425.         part1 = RESULT
  426.         CALL filter(part3,1)
  427.         part3 =  RESULT
  428.         email = part1'@'part2'.'adres
  429.         CALL dubbel(email, 1)
  430.       END
  431.       IF POS('@', rest) ~= 0 THEN DO
  432.         PARSE VAR rest part1 '@' part2 '.' part3 rest
  433.         empty = 0
  434.       END 
  435.       ELSE empty = 1
  436.       IF empty = 1 THEN LEAVE
  437.     END
  438.   END
  439.   'CLOSEPROGRESS REQ' progressid
  440.   CALL CLOSE(tmp)
  441.   IF reqfile = 0 THEN DELETE(tempfile)
  442. RETURN
  443. /*~!*/
  444.  
  445. /*!~ "userdata" */
  446. userdata:
  447.   IF alias.n = 'ALIAS.'n THEN alias.n = ''
  448.   IF comm.n  = 'COMM.'n  THEN comm.n  = ''
  449.   showdata.1 = 'name    :' name.n
  450.   showdata.2 = 'address :' save.n
  451.   showdata.3 = 'alias   :' alias.n
  452.   showdata.4 = 'comment :' comm.n
  453.   showdata.5 = ''
  454.   showdata.6 = 'RETURN'
  455.   showdata.count = 6
  456.   titel = 'Userdata for' save.n
  457.   'REQUESTLIST INSTEM' showdata 'TITLE "'titel'" SIZEGADGET'
  458.   IF (RC = 30) THEN DO
  459.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  460.     CALL cleanup
  461.   END
  462.   IF RC ~= 5 THEN DO
  463.     sel = RESULT
  464.     IF sel = showdata.1 THEN DO
  465.       RESULT = name.n
  466.       'REQUESTSTRING TITLE "Enter a name for" BT "_OK|_From:|_Cancel" BODY "'save.n'" INITIALSTRING "'name.n'"'
  467.       IF THORRC = 0 then name.n = ''
  468.       IF THORRC = 1 then name.n = RESULT
  469.       IF THORRC = 2 THEN name.n = fromname
  470.     END
  471.     IF sel = showdata.2 THEN DO
  472.       RESULT = save.n
  473.       'REQUESTSTRING TITLE "Change address" BT "_OK|_Cancel" BODY "'save.n'" INITIALSTRING "'save.n'"'
  474.       save.n = RESULT
  475.     END
  476.     IF sel = showdata.3 THEN DO
  477.       RESULT = alias.n
  478.       'REQUESTSTRING TITLE "Enter an alias for" BT "_OK|_Cancel" BODY "'save.n'" INITIALSTRING "'alias.n'"'
  479.       alias.n = RESULT
  480.     END
  481.     IF sel = showdata.4 THEN DO
  482.       RESULT = comm.n
  483.       'REQUESTSTRING TITLE "Enter a comment for" BT "_OK|_Cancel" BODY "'save.n'" INITIALSTRING "'comm.n'"'
  484.       comm.n = RESULT
  485.     END
  486.     IF sel = 'RETURN' THEN SIGNAL listsave(2)
  487.     SIGNAL userdata
  488.   END
  489. RETURN
  490. /*~!*/
  491.  
  492. /*!~ "save_userdata" */
  493. save_userdata:
  494.   DROP USER.
  495.   DO i = 1 TO save.count
  496.     IF name.i = '' THEN DO
  497.       PARSE VAR save.i part1 '@'
  498.       name.i = part1
  499.     END
  500.     USER.NAME      = name.i
  501.     USER.ADDRESS   = save.i
  502.     USER.ALIAS     = alias.i
  503.     USER.COMMENT.1 = comm.i
  504.     IF USER.COMMENT.1 = '' THEN USER.COMMENT.COUNT = 0
  505.     ELSE USER.COMMENT.COUNT = 1
  506.     ADDRESS BBSREAD 'WRITEBRUSER BBSNAME "'bbs'" STEM USER ONLYIFEXIST'
  507.     IF RC~=0 THEN DO
  508.       'REQUESTNOTIFY TEXT "'BBSREAD.LASTERROR'" BT "_Ok"'
  509.       CALL cleanup
  510.     END
  511.   END
  512. RETURN
  513. /*~!*/
  514. /*~!*/
  515.  
  516. /*!~ "GetFTP" */
  517. /*!~ "get_ftp" */
  518. get_ftp:
  519.   'OPENPROGRESS TITLE "'maintitle'" TOTAL 0 AT "_Abort" PT "Hold on, saving message..."'
  520.   IF(RC ~= 0) THEN DO
  521.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  522.     CALL cleanup
  523.   END
  524.   ELSE progressid = RESULT
  525.   IF reqfile = 0 THEN DO
  526.     'SAVEMESSAGE BBSNAME "'curbbs'" CONFNAME "'curconf'" MSGNR' msgnum 'FILENAME' tempfile 'NOHEADER NOANSI OVERWRITE'
  527.     IF(RC ~= 0) THEN DO
  528.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  529.       CALL cleanup
  530.     END
  531.   END
  532.   CALL getftp
  533.   CALL listfound
  534.   IF ok = 1 THEN CALL listsave(1)
  535. RETURN
  536. /*~!*/
  537.  
  538. /*!~ "getftp" */
  539. getftp:
  540.   opentmp = OPEN(tmp, tempfile, 'R')
  541.   filelngth = SEEK(tmp,0,'E')
  542.   'UPDATEPROGRESS REQ' progressid 'TOTAL' filelngth 'PT "Searching... (0)"'
  543.   IF RC = 5 THEN CALL cleanup 
  544.   IF(RC = 30) THEN DO
  545.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  546.      CALL cleanup
  547.   END
  548.   CALL SEEK(tmp, 0,'B')
  549.   num = 0; found.count = 0; sumadres = ''; curpos = 0
  550.   DO UNTIL curpos = filelngth
  551.     msg = READLN(tmp)
  552.     curpos = SEEK(tmp, 0)
  553.     IF curpos // 10 = 0 THEN 'UPDATEPROGRESS REQ' progressid 'CURRENT' curpos
  554.     IF RC = 5 THEN CALL cleanup
  555.     IF(RC = 30) THEN DO
  556.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  557.       CALL cleanup
  558.     END
  559.     IF POS('FTP://', UPPER(msg)) ~=0 THEN DO
  560.       CALL getftp2
  561.     END
  562.     IF extra = 1 THEN DO
  563.       CALL getip
  564.     END
  565.   END
  566.   'CLOSEPROGRESS REQ' progressid
  567.   CALL CLOSE(tmp)
  568.   IF reqfile = 0 THEN DELETE(tempfile)
  569. RETURN
  570. /*~!*/
  571.  
  572. /*!~ "getftp2" */
  573. getftp2:
  574.   msg2 = OVERLAY('ftp', msg, POS('FTP://',UPPER(msg)))
  575.   PARSE VAR msg2 . 'ftp://' ftpadres rest
  576.   DO FOREVER    
  577.     IF ftpadres ~= '' THEN DO
  578.       CALL filter(ftpadres,1)
  579.       ftpadres = 'ftp://'||RESULT
  580.       CALL checkdomain(ftpadres, 'FTP')
  581.       CALL dubbel(ftpadres, 0)
  582.     END
  583.     IF POS('FTP://', UPPER(rest)) ~= 0 THEN DO
  584.       msg2 = OVERLAY('ftp', rest, POS('FTP://',UPPER(rest)))
  585.       PARSE VAR msg2 . 'ftp://' ftpadres rest
  586.       empty = 0
  587.     END 
  588.     ELSE empty = 1
  589.     IF empty = 1 THEN LEAVE
  590.   END
  591. RETURN
  592. /*~!*/
  593.  
  594. /*!~ "getip" */
  595. getip:
  596.   msg2 = SPACE(msg,1,'|')
  597.   PARSE VAR msg2 part1'.'part2'|'rest
  598.   DO FOREVER
  599.     domainOK = 0
  600.     IF (POS('HTTP://',UPPER(part1))~=0) THEN LEAVE
  601.     IF ((part2 ~= '' & POS('|',part2) = 0) & (length(part1)>1 & length(part2)>1)) THEN DO
  602.       CALL filter(part1,2)
  603.       part1 = RESULT
  604.       CALL filter(part2,1)
  605.       part2 =  RESULT
  606.       ftpadres = 'ftp://'part1'.'part2
  607.       IF (pos('@',ftpadres) = 0 & pos('www', ftpadres) = 0 & LENGTH(part2) >= 2 & pos('..', ftpadres) = 0) THEN DO
  608.         part2 = '.'part2
  609.         CALL checkdomain(ftpadres, 'IP')
  610.         IF DATATYPE(part1, 'NUM') THEN DO
  611.           PARSE VAR ftpadres 'ftp://' num1 '.' num2 '.' num3 '.' num4
  612.           IF (DATATYPE(num1, 'NUM') & DATATYPE(num2, 'NUM') & DATATYPE(num3, 'NUM') & num4 ~= '') THEN domainOK = 1
  613.         END
  614.       CALL dubbel(ftpadres, 0)
  615.       END
  616.     END
  617.     IF POS('.', rest) ~= 0 THEN DO
  618.       PARSE VAR rest part1'.'part2'|'rest
  619.       empty = 0
  620.     END
  621.     ELSE empty = 1
  622.     IF empty = 1 THEN LEAVE
  623.   END
  624. RETURN
  625. /*~!*/
  626. /*~!*/
  627.  
  628. /*!~ "GetAminet" */
  629. /*!~ "get_aminet" */
  630. get_aminet:
  631.   'OPENPROGRESS TITLE "'maintitle'" TOTAL 0 AT "_Abort" PT "Hold on, saving message..."'
  632.   IF(RC ~= 0) THEN DO
  633.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  634.     CALL cleanup
  635.   END
  636.   ELSE progressid = RESULT
  637.   IF reqfile = 0 THEN DO
  638.     'SAVEMESSAGE BBSNAME "'curbbs'" CONFNAME "'curconf'" MSGNR' msgnum 'FILENAME' tempfile 'NOANSI OVERWRITE NOHEADER'
  639.     IF(RC ~= 0) THEN DO
  640.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  641.       CALL cleanup
  642.     END
  643.   END
  644.   CALL getaminet
  645.   CALL listfound
  646.   IF ok = 1 THEN CALL create_dlevent
  647. RETURN
  648. /*~!*/
  649.  
  650. /*!~ "getaminet" */
  651. getaminet:
  652.   opentmp = OPEN(tmp, tempfile, 'R')
  653.   filelngth = SEEK(tmp,0,'E')
  654.   'UPDATEPROGRESS REQ' progressid 'TOTAL' filelngth 'PT "Searching... (0)"'
  655.   IF RC = 5 THEN CALL cleanup
  656.   IF(RC = 30) THEN DO
  657.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  658.      CALL cleanup
  659.   END
  660.   CALL SEEK(tmp, 0,'B')
  661.   num = 0; found.count = 0; sumadres = ''; curpos = 0
  662.   DO UNTIL curpos = filelngth
  663.     msg = READLN(tmp)
  664.     curpos = SEEK(tmp, 0)
  665.     IF curpos // 10 = 0 THEN 'UPDATEPROGRESS REQ' progressid 'CURRENT' curpos
  666.     IF RC = 5 THEN CALL cleanup
  667.     IF RC = 30 THEN DO
  668.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  669.       CALL cleanup
  670.     END
  671.     IF RC = 0 THEN DO
  672.       PARSE VAR msg 1 file 20 dir1'/'dir2 .
  673.       file = strip(file)
  674.       dir = strip(dir1'/'dir2)
  675.       IF (POS('AHL.', UPPER(REVERSE(file))) = 1 | POS('SMD.', UPPER(REVERSE(file))) = 1 | POS('HZL.', UPPER(REVERSE(file))) = 1) THEN DO
  676.         aminetfile = LEFT(file,20, ' ')||'('||dir||')'
  677.         CALL dubbel(aminetfile,1)
  678.         curpos = SEEK(tmp, 0)
  679.       END
  680.     END
  681.   END
  682.   'CLOSEPROGRESS REQ' progressid
  683.   CALL CLOSE(tmp)
  684.   IF reqfile = 0 THEN DELETE(tempfile)
  685. RETURN
  686. /*~!*/
  687. /*~!*/
  688.  
  689. /*!~ "Save hotlists" */
  690. /*!~ "savehotlist" */
  691. savehotlist:
  692.   IF scanhttp = 1 THEN savetotal = pro_http
  693.   IF (scanftp = 1 & ftpsavemode = 'W') THEN savetotal = pro_http
  694.   IF (scanftp = 1 & ftpsavemode = 'B') THEN savetotal = pro_http + pro_ftp
  695.   IF (scanftp = 1 & ftpsavemode = 'F') THEN savetotal = pro_ftp
  696.  
  697.   DO sv = 1 TO save.count
  698.     IF name.sv = '' THEN name.sv = subj '('sv')'
  699.   END
  700.   'OPENPROGRESS TITLE "'maintitle'" TOTAL' savetotal ' PT "Saving addresses..."'
  701.   IF(RC ~= 0) THEN DO
  702.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  703.     CALL cleanup
  704.   END
  705.   ELSE pbsave = RESULT
  706.  
  707.   IF amosaic = 1 THEN DO
  708.     IF (scanftp = 1 & (ftpsavemode = 'W' | ftpsavemode = 'B')) THEN CALL save_amosaic
  709.     IF scanftp = 0 THEN CALL save_amosaic
  710.   END
  711.   IF ibrowse = 1 THEN DO
  712.     IF (scanftp = 1 & (ftpsavemode = 'W' | ftpsavemode = 'B')) THEN CALL save_ibrowse
  713.     IF scanftp = 0 THEN CALL save_ibrowse
  714.   END
  715.   IF html    = 1 THEN DO
  716.     IF (scanftp = 1 & (ftpsavemode = 'W' | ftpsavemode = 'B')) THEN CALL save_html
  717.     IF scanftp = 0 THEN CALL save_html
  718.   END
  719.   IF aweb    = 1 THEN DO
  720.     IF (scanftp = 1 & (ftpsavemode = 'W' | ftpsavemode = 'B')) THEN CALL save_aweb
  721.     IF scanftp = 0 THEN CALL save_aweb
  722.   END
  723.   IF voyager = 1 THEN DO
  724.     IF (scanftp = 1 & (ftpsavemode = 'W' | ftpsavemode = 'B')) THEN CALL save_voyager
  725.     IF scanftp = 0 THEN CALL save_voyager
  726.   END
  727.   IF tcpdl = 1 THEN DO
  728.     IF (scanftp = 1 & (ftpsavemode = 'W' | ftpsavemode = 'B')) THEN CALL save_tcpdl
  729.     IF scanftp = 0 THEN CALL save_tcpdl
  730.   END
  731.   IF (ncftp   = 1 & scanftp = 1 & (ftpsavemode = 'F' | ftpsavemode = 'B')) THEN CALL save_ncftp
  732.   IF (dopus   = 1 & scanftp = 1 & (ftpsavemode = 'F' | ftpsavemode = 'B')) THEN CALL save_dopus
  733.   IF (guiftp  = 1 & scanftp = 1 & (ftpsavemode = 'F' | ftpsavemode = 'B')) THEN CALL save_guiftp
  734.   IF (amftp   = 1 & scanftp = 1 & (ftpsavemode = 'F' | ftpsavemode = 'B')) THEN CALL save_amftp
  735.   'CLOSEPROGRESS REQ' pbsave
  736.   IF pro_http + pro_ftp = 0 THEN 'REQUESTNOTIFY "No hotlist(s) configured.\nUse CfgGetNET to configure them." "_OK"'
  737. RETURN
  738. /*~!*/
  739.  
  740. /*!~ "save_amosaic" */
  741. save_amosaic:
  742.   IF ~EXISTS(hotlist_amosaic) THEN DO
  743.     'REQUESTNOTIFY "Amosaic hotlist not found!" "_OK"'
  744.     RETURN
  745.   END
  746.   ELSE DO
  747.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' amosaic 'PT "Saving to AMosaic..."'
  748.     IF RC = 5 THEN CALL cleanup
  749.     IF(RC = 30) THEN DO
  750.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  751.       CALL cleanup
  752.     END
  753.     dat = DATE()
  754.     PARSE VAR dat dagnr maand jaar
  755.     dag = LEFT(DATE('W', DATE(S), 'S'), 3)
  756.     datum = dag maand dagnr TIME()jaar
  757.     CALL OPEN(htlst,hotlist_amosaic,'a')
  758.     DO sa = 1 TO save.count
  759.       CALL WRITELN(htlst,save.sa||' '||datum)
  760.       CALL WRITELN(htlst,STRIP(name.sa))
  761.     END
  762.     CALL CLOSE(htlst)
  763.   END
  764.   ADDRESS COMMAND 'copy' hotlist_amosaic 'env:mosaic/ quiet'
  765. RETURN
  766. /*~!*/
  767.  
  768. /*!~ "save_ibrowse" */
  769. save_ibrowse:
  770.   IF ~EXISTS(hotlist_ibrowse) THEN DO
  771.     'REQUESTNOTIFY "IBrowse hotlist not found!" "_OK"'
  772.     RETURN
  773.   END
  774.   ELSE DO
  775.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' amosaic+ibrowse 'PT "Saving to IBrowse..."'
  776.     IF RC = 5 THEN CALL cleanup
  777.     IF(RC = 30) THEN DO
  778.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  779.       CALL cleanup
  780.     END
  781.     CALL OPEN(in,hotlist_ibrowse,'r')
  782.     CALL OPEN(out,'t:IBrowse.tmp','w')
  783.       line = READLN(in)
  784.       DO UNTIL line = '<UL>'
  785.         WRITELN(out, line)
  786.         line = READLN(in)
  787.       END
  788.       WRITELN(out, line)
  789.       DO si = 1 TO save.count
  790.         adres = '<LI><A HREF="'||save.si||'">'STRIP(name.si)'</A><br>'
  791.         WRITELN(out, adres)
  792.       END
  793.       DO UNTIL EOF(in)
  794.         rest = readch(in,1048576)
  795.         WRITECH(out, rest)
  796.       END
  797.     CALL CLOSE(out)
  798.     CALL CLOSE(in)
  799.     ADDRESS COMMAND 'copy t:ibrowse.tmp' hotlist_ibrowse 'quiet'
  800.     DELETE('t:ibrowse.tmp')
  801.   END
  802. RETURN
  803. /*~!*/
  804.  
  805. /*!~ "save_html" */
  806. save_html:
  807.   IF ~EXISTS(hotlist_html) THEN DO
  808.     'REQUESTNOTIFY "HTML hotlist not found!" "_OK"'
  809.     RETURN
  810.   END
  811.   ELSE DO
  812.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' amosaic+ibrowse+html 'PT "Saving to HTML..."'
  813.     IF RC = 5 THEN CALL cleanup
  814.     IF(RC = 30) THEN DO
  815.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  816.       CALL cleanup
  817.     END
  818.     CALL OPEN(htlst,hotlist_html,'a')
  819.     DO sh = 1 TO save.count
  820.       CALL WRITELN(htlst,'<LI><A HREF="'save.sh'">'STRIP(name.sh)'</A><br>')
  821.     END
  822.     CALL CLOSE(htlst)
  823.   END
  824. RETURN
  825. /*~!*/
  826.  
  827. /*!~ "save_aweb" */
  828. save_aweb:
  829.   IF ~EXISTS(hotlist_aweb) THEN DO
  830.     'REQUESTNOTIFY "AWeb hotlist not found!" "_OK"'
  831.     RETURN
  832.   END
  833.   ELSE DO
  834.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' amosaic+ibrowse+html+aweb 'PT "Saving to AWeb..."'
  835.     IF RC = 5 THEN CALL cleanup
  836.     IF(RC = 30) THEN DO
  837.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  838.       CALL cleanup
  839.     END
  840.     CALL OPEN(htlst,hotlist_aweb,'a')
  841.     DO sw = 1 TO save.count
  842.       CALL WRITELN(htlst,save.sw)
  843.       CALL WRITELN(htlst,STRIP(name.sw))
  844.     END
  845.     CALL CLOSE(htlst)
  846.   END
  847. RETURN
  848. /*~!*/
  849.  
  850. /*!~ "save_voyager" */
  851. save_voyager:
  852.   IF ~EXISTS(hotlist_voyager) THEN DO
  853.     'REQUESTNOTIFY "Voyager hotlist not found!" "_OK"'
  854.     RETURN
  855.   END
  856.   ELSE DO
  857.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' amosaic+ibrowse+html+aweb+voyager 'PT "Saving to Voyager..."'
  858.     IF RC = 5 THEN CALL cleanup
  859.     IF(RC = 30) THEN DO
  860.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  861.       CALL cleanup
  862.     END
  863.     CALL OPEN(in,hotlist_voyager,'r')
  864.     CALL OPEN(out,'t:voyager.tmp','w')
  865.       line = READLN(in)
  866.       DO UNTIL line = '<UL>'
  867.         WRITELN(out, line)
  868.         line = READLN(in)
  869.       END
  870.       WRITELN(out, line)
  871.       DO vo = 1 TO save.count
  872.         adres = '<LI><A HREF="'||save.vo||'">'STRIP(name.vo)'</A><br>'
  873.         WRITELN(out, adres)
  874.       END
  875.       DO UNTIL EOF(in)
  876.         rest = readch(in,1048576)
  877.         WRITECH(out, rest)
  878.       END
  879.     CALL CLOSE(out)
  880.     CALL CLOSE(in)
  881.     ADDRESS COMMAND 'copy t:voyager.tmp' hotlist_voyager 'quiet'
  882.    DELETE('t:voyager.tmp')
  883.   END
  884. RETURN
  885. /*~!*/
  886.  
  887. /*!~ "save_tcpdl"*/
  888. save_tcpdl:
  889.   IF ~EXISTS(hotlist_tcpdl) THEN DO
  890.     'REQUESTNOTIFY "TCPdl hotlist not found!" "_OK"'
  891.     RETURN
  892.   END
  893.   ELSE DO
  894.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' amosaic+aweb+ibrowse+voyager+html+tcpdl 'PT "Saving to TCPdl..."'
  895.     IF RC = 5 THEN CALL cleanup
  896.     IF(RC = 30) THEN DO
  897.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  898.       CALL cleanup
  899.     END
  900.     CALL OPEN(out,hotlist_tcpdl,'a')
  901.       DO tl = 1 TO save.count
  902.         adres = pre_tcpdl||save.tl||' 'suf_tcpdl
  903.         WRITELN(out, adres)
  904.       END
  905.     CALL CLOSE(out)
  906.   END
  907. RETURN
  908. /*~!*/
  909.  
  910. /*!~ "save_ncftp" */
  911. save_ncFTP:
  912.   IF ~EXISTS(hotlist_ncftp) THEN DO
  913.     'REQUESTNOTIFY "ncFTP hotlist not found!" "_OK"'
  914.     RETURN
  915.   END
  916.   ELSE DO
  917.     IF ftpsavemode = 'F' THEN pro_cur = ncftp
  918.     IF ftpsavemode = 'B' THEN pro_cur = pro_http + ncftp
  919.  
  920.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' pro_cur 'PT "Saving to ncFTPrecent..."'
  921.     IF RC = 5 THEN CALL cleanup
  922.     IF(RC = 30) THEN DO
  923.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  924.       CALL cleanup
  925.     END
  926.     CALL OPEN(in,hotlist_ncftp,'r')
  927.     CALL OPEN(out,'t:ncftp.tmp','w')
  928.     CALL convdate
  929.       DO nc = 1 TO save.count
  930.         CALL prepftp(save.nc)
  931.         adres = LEFT(ftpadr,34,' ') now ftpdir
  932.         WRITELN(out, adres)
  933.       END
  934.       DO UNTIL EOF(in)
  935.         rest = readch(in,1048576)
  936.         WRITECH(out, rest)
  937.       END
  938.     CALL CLOSE(out)
  939.     CALL CLOSE(in)
  940.     ADDRESS COMMAND 'copy t:ncftp.tmp' hotlist_ncftp 'quiet'
  941.    DELETE('t:ncftp.tmp')
  942.   END
  943. RETURN
  944. /*~!*/
  945.  
  946. /*!~ "save_dopus" */
  947. save_dopus:
  948.   IF ~EXISTS(hotlist_dopus) THEN DO
  949.     'REQUESTNOTIFY "DOpusFTP hotlist not found!" "_OK"'
  950.     RETURN
  951.   END
  952.   ELSE DO
  953.     IF ftpsavemode = 'F' THEN pro_cur = ncftp+dopus
  954.     IF ftpsavemode = 'B' THEN pro_cur = pro_http + ncftp + dopus
  955.  
  956.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' pro_cur 'PT "Saving to DOpusFTP..."'
  957.     IF RC = 5 THEN CALL cleanup
  958.     IF(RC = 30) THEN DO
  959.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  960.       CALL cleanup
  961.     END
  962.     CALL OPEN(in,hotlist_dopus,'a')
  963.       DO dp = 1 TO save.count
  964.         CALL prepftp(save.dp)
  965.         IF ftpsitename THEN name.dp = ftpadr
  966.         IF ftpfile = '' THEN ftpname = name.dp
  967.         ELSE ftpname = name.dp '('ftpfile')'
  968.         PARSE VAR ftpadr tstnum '.'
  969.         IF DATATYPE(tstnum, 'NUM') THEN adres = 'anon alias="'ftpname'" addr="'ftpadr'" dir="'ftpdir'"'
  970.         ELSE adres = 'anon alias="'ftpname'" host="'ftpadr'" dir="'ftpdir'"'
  971.         WRITELN(in, adres)
  972.       END
  973.     CALL CLOSE(in)
  974.   END
  975. RETURN
  976. /*~!*/
  977.  
  978. /*!~ "save_guiftp" */
  979. save_guiftp:
  980.   IF ~EXISTS(hotlist_guiftp) THEN DO
  981.     'REQUESTNOTIFY "GUI-FTP hotlist not found!" "_OK"'
  982.     RETURN
  983.   END
  984.   ELSE DO
  985.     IF ftpsavemode = 'F' THEN pro_cur = ncftp+dopus+guiftp
  986.     IF ftpsavemode = 'B' THEN pro_cur = pro_http + ncftp + dopus + guiftp
  987.  
  988.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' pro_cur 'PT "Saving to GUI-FTP..."'
  989.     IF RC = 5 THEN CALL cleanup
  990.     IF(RC = 30) THEN DO
  991.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  992.       CALL cleanup
  993.     END
  994.     CALL OPEN(in, hotlist_guiftp, 'A')
  995.       DO gf = 1 TO save.count
  996.         CALL prepftp(save.gf)
  997.         IF ftpsitename THEN name.gf = ftpadr
  998.         IF ftpfile ~= '' THEN ftpname = name.gf '('ftpfile')'
  999.         ELSE ftpname = name.gf
  1000.         WRITELN(in, 'machine' ftpadr)
  1001.         WRITELN(in, ' description' ftpname)
  1002.         WRITELN(in, ' dir' ftpdir)
  1003.         WRITELN(in, ' anonftp')
  1004.         WRITELN(in, '')
  1005.       END
  1006.     CALL CLOSE(in)
  1007.   END
  1008. RETURN
  1009. /*~!*/
  1010.  
  1011. /*!~ "save_amftp" */
  1012. save_amftp:
  1013.   IF ~SHOW('p', 'AMFTP.1') THEN DO
  1014.     'REQUESTNOTIFY TEXT "AmFTP is not running.\n\nTo save the addresses to the AmFTP\nhotlist AmFTP needs to be running.\n\nStart AmFTP?" BT "_Yes|_No"'
  1015.     IF RC = 0 THEN DO
  1016.       IF RESULT = 1 THEN DO
  1017.         IF ~EXISTS(path_amftp) THEN DO
  1018.           'REQUESTNOTIFY TEXT "AmFTP not found." BT "_OK"'
  1019.           RETURN
  1020.         END
  1021.         ELSE DO
  1022.           IF ~SHOWLIST('L','bsdsocket.library') THEN DO
  1023.              ADDRESS COMMAND tcp_ip
  1024.              IF SHOWLIST('L','bsdsocket.library') THEN CALL run_amftp
  1025.              ELSE DO
  1026.                'REQUESTNOTIFY TEXT "No bsdsocket.library found.\n\nCan''t save to AmFTP hotlist" BT "_OK"'
  1027.              END
  1028.           END
  1029.           ELSE DO
  1030.             CALL run_amftp
  1031.           END
  1032.         END
  1033.       END
  1034.       IF RESULT = 0 THEN RETURN
  1035.     END
  1036.   END
  1037.  
  1038.   IF SHOW('p', 'AMFTP.1') THEN DO
  1039.     IF ftpsavemode = 'F' THEN pro_cur = ncftp+dopus+guiftp+amftp
  1040.     IF ftpsavemode = 'B' THEN pro_cur = pro_http+ncftp+dopus+guiftp+amftp
  1041.  
  1042.     ADDRESS(thorport)
  1043.     'THORTOFRONT'
  1044.     'UPDATEPROGRESS REQ' pbsave 'CURRENT' pro_cur 'PT "Saving to AmFTP..."'
  1045.     IF RC = 5 THEN CALL cleanup
  1046.     IF(RC = 30) THEN DO
  1047.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  1048.       CALL cleanup
  1049.     END
  1050.     ADDRESS AMFTP.1
  1051.     DO af = 1 TO save.count
  1052.       CALL prepftp(save.af)
  1053.       IF ftpsitename THEN name.af = ftpadr
  1054.       IF ftpfile ~= '' THEN ftpname = name.af '('ftpfile')'
  1055.       ELSE ftpname = name.af
  1056.       STEM.HOST     = ftpadr
  1057.       STEM.PORT     = 21
  1058.       STEM.ADT      = 0
  1059.       STEM.ANON     = 1
  1060.       STEM.DEFDIR   = ftpdir
  1061.       'CREATEPROFILE "'ftpname'"'
  1062.       'SETPROFILE' RESULT STEM
  1063.     END
  1064.     'SAVEPROFILES'
  1065.     ADDRESS(thorport)
  1066.   END
  1067.   ELSE DO
  1068.     'REQUESTNOTIFY TEXT "AmFTP is not running.\n\nCould not save to AmFTP." BT "_OK"'
  1069.   END
  1070. RETURN
  1071. /*~!*/
  1072.  
  1073. /*!~ "run_amftp" */
  1074. run_amftp:
  1075.   ADDRESS COMMAND
  1076.     'run <>nil:' path_amftp
  1077.     'WaitForPort AMFTP.1'
  1078. RETURN
  1079. /*~!*/
  1080.  
  1081. /*!~ "prepftp" */
  1082. prepftp:
  1083.   tmpftp = ARG(1)
  1084.   ftpfile = ''
  1085.   tmpftp = TRANSLATE(tmpftp, '/', ':')
  1086.   PARSE VAR tmpftp 'ftp///' ftpadr '/' ftpdir
  1087.   CALL filter(ftpadr,2)
  1088.   ftpadr = RESULT
  1089.   IF ftpdir = '' THEN ftpdir = '/'
  1090.   IF (ftpdir ~= '' & (dopus = 1 | guiftp = 1 | amftp = 1)) THEN DO
  1091.     IF LASTPOS('/', ftpdir) < LENGTH(ftpdir) THEN DO
  1092.       DO ft = 1 TO filetype.count
  1093.         IF POS(filetype.ft, UPPER(ftpdir)) ~= 0 THEN DO
  1094.           ftpfile = SUBSTR(ftpdir, (LASTPOS('/', ftpdir) + 1))
  1095.           ftpdir = SUBSTR(ftpdir, 1, LASTPOS('/', ftpdir))
  1096.         END
  1097.       END
  1098.     END
  1099.   END
  1100. RETURN
  1101. /*~!*/
  1102.  
  1103. /*!~ "convdate" */
  1104. convdate:
  1105.   DROP dat.
  1106.   datum = Date('S')
  1107.   tijd  = time('N')
  1108.   dat.HOUR  = SUBSTR(tijd,1,2)
  1109.   dat.MIN   = SUBSTR(tijd,4,2)
  1110.   dat.SEC   = SUBSTR(tijd,7,2)
  1111.   dat.YEAR  = SUBSTR(datum,1,4)
  1112.   dat.MONTH = SUBSTR(datum,5,2)
  1113.   dat.MDAY  = SUBSTR(datum,7,2)
  1114.   ADDRESS BBSREAD DATE2AMIGA dat
  1115.   now = RESULT
  1116. RETURN
  1117. /*~!*/
  1118. /*~!*/
  1119.  
  1120. /*!~ "Misc functions" */
  1121. /*!~ "LoadPrefs" */
  1122. loadprefs:
  1123.   IF ~EXISTS(cfgpath||cfgfile) THEN DO
  1124.     Address(thorport)
  1125.     'Requestnotify TEXT "Could not find the configuration file.\nRun CfgGetNET to create one." BT "_OK"'
  1126.     EXIT
  1127.   END
  1128.   ELSE DO
  1129.     CALL OPEN(prf,cfgpath||cfgfile,'R')
  1130.       DO UNTIL EOF(prf)
  1131.         line = READLN(prf)
  1132.         SELECT
  1133.           WHEN UPPER(WORD(line,1)) = 'BBS' THEN DO
  1134.             bbs = SUBWORD(line,2)
  1135.           END
  1136.           WHEN UPPER(WORD(line,1)) = 'ASKFR' THEN DO
  1137.             askfr = WORD(line,2)
  1138.           END
  1139.           WHEN Upper(Word(line,1)) = 'REQDIR' THEN DO
  1140.             reqdir = SubWord(line,2)
  1141.           END
  1142.           WHEN Upper(Word(line,1)) = 'FTPSAVEMODE' THEN DO
  1143.             ftpsavemode = UPPER(WORD(line,2))
  1144.           END
  1145.           WHEN Upper(Word(line,1)) = 'FTPSITENAME' THEN DO
  1146.             ftpsitename = UPPER(WORD(line,2))
  1147.           END
  1148.           WHEN UPPER(WORD(line,1)) = 'AMOSAIC' THEN DO
  1149.             hotlist_amosaic = WORD(line,2)
  1150.             amosaic = WORD(line,3)
  1151.           END
  1152.           WHEN UPPER(WORD(line,1)) = 'AWEB' THEN DO
  1153.             hotlist_aweb = WORD(line,2)
  1154.             aweb = WORD(line,3)
  1155.           END
  1156.           WHEN UPPER(WORD(line,1)) = 'IBROWSE' THEN DO
  1157.             hotlist_ibrowse = WORD(line,2)
  1158.             ibrowse = WORD(line,3)
  1159.           END
  1160.           WHEN UPPER(WORD(line,1)) = 'VOYAGER' THEN DO
  1161.             hotlist_voyager = WORD(line,2)
  1162.             voyager = WORD(line,3)
  1163.           END
  1164.           WHEN UPPER(WORD(line,1)) = 'HTML' THEN DO
  1165.             hotlist_html = WORD(line,2)
  1166.             html = WORD(line,3)
  1167.           END
  1168.           WHEN UPPER(WORD(line,1)) = 'NCFTP' THEN DO
  1169.             hotlist_ncftp = WORD(line,2)
  1170.             ncftp = WORD(line,3)
  1171.           END
  1172.           WHEN UPPER(WORD(line,1)) = 'DOPUS' THEN DO
  1173.             hotlist_dopus = WORD(line,2)
  1174.             dopus = WORD(line,3)
  1175.           END
  1176.           WHEN UPPER(WORD(line,1)) = 'GUIFTP' THEN DO
  1177.             hotlist_guiftp = WORD(line,2)
  1178.             guiftp = WORD(line,3)
  1179.           END
  1180.           WHEN UPPER(WORD(line,1)) = 'AMFTP' THEN DO
  1181.             path_amftp = WORD(line,2)
  1182.             amftp = WORD(line,3)
  1183.           END
  1184.           WHEN UPPER(WORD(line,1)) = 'TCPDL' THEN DO
  1185.             hotlist_tcpdl = WORD(line,2)
  1186.             tcpdl = WORD(line,3)
  1187.           END
  1188.           WHEN UPPER(WORD(line,1)) = 'TCPDL_PRE' THEN DO
  1189.             pre_tcpdl = SUBWORD(line,2)
  1190.           END
  1191.           WHEN UPPER(WORD(line,1)) = 'TCPDL_SUF' THEN DO
  1192.             suf_tcpdl = SUBWORD(line,2)
  1193.           END
  1194.           WHEN UPPER(WORD(line,1)) = 'TCP-IP' THEN DO
  1195.             tcp_ip = SUBWORD(line,2)
  1196.           END
  1197.           OTHERWISE NOP
  1198.         END
  1199.       END
  1200.     CALL CLOSE(prf)
  1201.     CALL checkprefs
  1202.   END
  1203. RETURN
  1204. /*~!*/
  1205.  
  1206. /*!~ "CheckPrefs" */
  1207. checkprefs:
  1208.   IF ~DATATYPE(askfr, 'BIN')       THEN CALL prefserror('ASKFR')
  1209.   IF ~DATATYPE(ftpsavemode, 'ALP') THEN CALL prefserror('FTPSAVEMODE')
  1210.   IF ~DATATYPE(ftpsitename, 'BIN') THEN CALL prefserror('FTPSITENAME')
  1211.   IF ~DATATYPE(amosaic, 'BIN')     THEN CALL prefserror('AMOSAIC')
  1212.   IF ~DATATYPE(aweb, 'BIN')        THEN CALL prefserror('AWEB')
  1213.   IF ~DATATYPE(ibrowse, 'BIN')     THEN CALL prefserror('IBROWSE')
  1214.   IF ~DATATYPE(voyager, 'BIN')     THEN CALL prefserror('VOYAGER')
  1215.   IF ~DATATYPE(html, 'BIN')        THEN CALL prefserror('HTML')
  1216.   IF ~DATATYPE(ncftp, 'BIN')       THEN CALL prefserror('NCFTP')
  1217.   IF ~DATATYPE(dopus, 'BIN')       THEN CALL prefserror('DOPUS')
  1218.   IF ~DATATYPE(guiftp, 'BIN')      THEN CALL prefserror('GUIFTP')
  1219.   IF ~DATATYPE(amftp, 'BIN')       THEN CALL prefserror('AMFTP')
  1220.   IF ~DATATYPE(tcpdl, 'BIN')       THEN CALL prefserror('TCPDL')
  1221. RETURN
  1222. /*~!*/
  1223.  
  1224. /*!~ "PrefsError" */
  1225. prefserror:
  1226.   prferr = ARG(1)
  1227.   ADDRESS(thorport)
  1228.   'REQUESTNOTIFY TEXT "The config file is not in the\ncorrect format. An error occured at\nor before 'prferr'.\nPlease run CfgGetNET to correct this.\n\nIf the problem remains, contact\nthe author at rvhooff@caiw.nl" BT "_OK"'
  1229.   CALL cleanup
  1230. RETURN
  1231. /*~!*/
  1232.  
  1233. /*!~ "Filter" */
  1234. filter:
  1235.   PARSE ARG adres,fltr
  1236.   lngth = LENGTH(adres)
  1237.   IF fltr = 2 THEN adres=REVERSE(adres)
  1238.   DO i = 1 TO filter.fltr.count
  1239.     check = POS(filter.fltr.i, adres)
  1240.     IF check ~=0 THEN adres = DELSTR(adres, check)
  1241.   END
  1242.   punt = LASTPOS('.', adres)
  1243.   IF punt ~=0 THEN lngth = length(adres)
  1244.   IF (punt = lngth) THEN adres = DELSTR(adres, punt)
  1245.   IF fltr = 2 THEN adres=REVERSE(adres)
  1246. RETURN(adres)
  1247. /*~!*/
  1248.  
  1249. /*!~ "ListFound" */
  1250. listfound:
  1251.   IF found.COUNT > 0 THEN DO
  1252.     IF scanaminet = 1 THEN foundtitel = 'Select files to download.'
  1253.     ELSE foundtitel = 'Select address(es) to save.'
  1254.     'REQUESTLIST INSTEM' found 'OUTSTEM' save 'TITLE "'foundtitel' Total: 'num'" MULTISELECT SIZEGADGET'
  1255.     IF (RC = 30) THEN DO
  1256.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  1257.       CALL cleanup
  1258.     END
  1259.     IF RC ~= 5 THEN ok = 1
  1260.   END
  1261.   IF found.COUNT = 0 THEN DO
  1262.     IF scanhttp = 1 THEN titel = 'HTTP addresses'
  1263.     IF scanemail = 1 THEN titel = 'Email addresses'
  1264.     IF scanftp = 1 THEN titel = 'FTP addresses'
  1265.     IF scanaminet = 1 THEN titel = 'Aminet files'
  1266.     'REQUESTNOTIFY TEXT "No' titel 'found in this message." BT "_Ok"'
  1267.   END
  1268. RETURN
  1269. /*~!*/
  1270.  
  1271. /*!~ "ListSave" */
  1272. listsave:
  1273.   PARSE ARG soort
  1274.     DO svc = 1 TO save.count
  1275.       IF name.svc = 'NAME.'svc THEN name.svc = subj '('svc')'
  1276.       showname.svc = LEFT(name.svc,20,' ')
  1277.       show.svc = showname.svc' - 'save.svc
  1278.     END
  1279.     sep = save.count +1
  1280.     but = save.count +2
  1281.     show.sep = ''
  1282.     show.but = 'SAVE'
  1283.     show.count = save.count+2
  1284.   IF soort = 1 THEN titel = 'Select to enter a name'
  1285.   IF soort = 2 THEN titel = 'Select address to edit userdata'
  1286.   'REQUESTLIST INSTEM' show 'TITLE "'titel'" SIZEGADGET'
  1287.   IF (RC = 30) THEN DO
  1288.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  1289.     CALL cleanup
  1290.   END
  1291.   IF RC ~= 5 THEN DO
  1292.     selected = RESULT
  1293.     IF selected = 'SAVE' THEN DO 
  1294.       IF soort = 1 THEN DO
  1295.         CALL savehotlist
  1296.         RETURN
  1297.       END
  1298.       IF soort = 2 THEN DO
  1299.         CALL save_userdata
  1300.         RETURN
  1301.       END
  1302.     END
  1303.     DO n = 1 TO save.count
  1304.       IF selected = show.n THEN DO
  1305.         IF soort = 1 THEN DO
  1306.           'REQUESTNOTIFY TEXT "What do you want to change?" BT "_Name|_URL"'
  1307.           IF RESULT = 1 THEN DO
  1308.             'REQUESTSTRING title "Enter a name" BT "_OK|_Cancel" BODY "'save.n'" ID "'name.n'"'
  1309.             IF RC = 0 THEN name.n = RESULT
  1310.             IF RC = 5 THEN name.n = name.n
  1311.           END
  1312.           IF RESULT = 0 THEN DO
  1313.             'REQUESTSTRING title "Edit the URL" BT "_OK|_Cancel" BODY "'save.n'" ID "'save.n'"'
  1314.             IF RC = 0 THEN save.n = RESULT
  1315.             IF RC = 5 THEN save.n = save.n
  1316.           END
  1317.         END
  1318.         IF soort = 2 THEN SIGNAL userdata
  1319.       END
  1320.     END
  1321.     IF soort = 1 THEN SIGNAL listsave(1)
  1322.     IF soort = 2 THEN SIGNAL listsave(2)
  1323.   END
  1324. RETURN
  1325. /*~!*/
  1326.  
  1327. /*!~ "Create_DLEvent" */
  1328. create_dlevent:
  1329. ADDRESS BBSREAD
  1330.   DO event = 1 to save.count
  1331.     PARSE VAR save.event save.event '(' dir.event ')'
  1332.     EVENTSTEM.FILENAME = STRIP(save.event)
  1333.     EVENTSTEM.DIRECTORY = dir.event
  1334.     'WRITEBREVENT BBSNAME "'bbs'" EVENT' EVE_DOWNLOAD 'STEM' EVENTSTEM
  1335.     IF (RC ~= 0) THEN DO
  1336.       ADDRESS(thorport)
  1337.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  1338.       CALL cleanup
  1339.     END
  1340.   END
  1341. RETURN
  1342. /*~!*/
  1343.  
  1344. /*!~ "Request_File" */
  1345. request_file:
  1346.   DROP selfile.
  1347.   'REQUESTFILE TITLE "Select file to scan." ID "'reqdir'" FP MS OUTSTEM' selfile
  1348.   IF (RC = 30) THEN DO
  1349.     'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  1350.     CALL cleanup
  1351.   END
  1352.   IF RC = 5 THEN CALL cleanup
  1353.   IF RC = 0 THEN DO
  1354.     'OPENPROGRESS TITLE "'maintitle'" TOTAL' selfile.count 'AT "_Abort" PT "Scanning messages (0/'selfile.count')"'
  1355.     IF(RC ~= 0) THEN DO
  1356.       'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  1357.       CALL cleanup
  1358.     END
  1359.     ELSE progressid1 = RESULT
  1360.  
  1361.     DO fl = 1 TO selfile.COUNT
  1362.       'UPDATEPROGRESS REQ' progressid1 'CURRENT' fl 'PT "Scanning messages ('fl'/'selfile.count')"'
  1363.       IF RC = 5 THEN CALL cleanup
  1364.       IF(RC = 30) THEN DO
  1365.         'REQUESTNOTIFY TEXT "'THOR.LASTERROR'" BT "_Ok"'
  1366.         CALL cleanup
  1367.       END
  1368.       tempfile = selfile.fl
  1369.       IF OPEN(reqtmp, tempfile, 'R') THEN DO
  1370.         CALL CLOSE(reqtmp)
  1371.         reqfile = 1
  1372.         subj = tempfile
  1373.         fromname = tempfile
  1374.         CALL main
  1375.       END
  1376.     END
  1377.   END
  1378. RETURN
  1379. /*~!*/
  1380.  
  1381. /*!~ "AskREQ" */
  1382. askreq:
  1383.   'REQUESTNOTIFY TEXT "Do you want to scan messages or select a file on disk?" BT "_Messages|_File|_Quit"'
  1384.   SELECT
  1385.     WHEN RESULT = 1 THEN req = ''
  1386.     WHEN RESULT = 2 THEN req = 'REQ'
  1387.     OTHERWISE CALL cleanup
  1388.   END
  1389. RETURN
  1390. /*~!*/
  1391.  
  1392. /*!~ "Dubbel" */
  1393. dubbel:
  1394.   scanadres = ARG(1)
  1395.   IF ARG(2) = 1 THEN domainOK = 1
  1396.   dubbel = POS(UPPER(scanadres'|'), UPPER(sumadres))
  1397.   IF (dubbel = 0 & domainOK ~= 0) THEN DO
  1398.     num = num + 1
  1399.     'UPDATEPROGRESS REQ' progressid 'PT "Searching... ('num')"'
  1400.     found.num = scanadres
  1401.     found.count = num
  1402.     sumadres = sumadres||scanadres'|'
  1403.   END
  1404. RETURN
  1405. /*~!*/
  1406.  
  1407. /*!~ "CheckDomain" */
  1408. checkdomain:
  1409.   adrespart = ARG(1)
  1410.   adrespart = TRANSLATE(adrespart, '/', ':')
  1411.   iptype = ARG(2)
  1412.   PARSE VAR adrespart '.' domainchk '/'
  1413.   IF iptype = 'IP' THEN domainchk = filter(domainchk,2)
  1414.   IF domainchk ~= '' THEN DO
  1415.     dom = LASTPOS('.', domainchk)
  1416.     INTERPRET "PARSE VAR domainchk . "dom" domainchk2"
  1417.     IF (Length(domainchk2) >= 2 & Length(domainchk2) <= 4) THEN domainOK = Pos(Upper(domainchk2)||'.', domains)
  1418.     ELSE domainOK = 0
  1419.   END
  1420.   ELSE domainOK = 0
  1421. RETURN
  1422. /*~!*/
  1423.  
  1424. /*!~ "Handle URL"*/
  1425. handle_url:
  1426.   url = ARG(1)
  1427.   drop save. name.
  1428.   CALL current_msg
  1429.   CALL msg_info
  1430.   save.1 = url  ; save.COUNT = 1
  1431.   name.1 = subj ; name.COUNT = 1
  1432.   ADDRESS(thorport)
  1433.   'REQUESTSTRING TITLE "Enter a name" BT "_OK|_Cancel" BODY "'save.1'" ID "'name.1'"'
  1434.   IF RC = 0 THEN name.1 = RESULT
  1435.   IF RC = 5 THEN EXIT
  1436.   scanhttp = 1
  1437.   CALL savehotlist
  1438. EXIT
  1439. /*~!*/
  1440.  
  1441. /*!~ "Syntax/Halt/Cleanup" */
  1442. SYNTAX:
  1443. SAY 'SYNTAX ERROR'
  1444. SAY 'Error 'rc' in line 'sigl': 'errortext(rc)
  1445. HALT:
  1446. cleanup:
  1447.  IF opentmp = 1 THEN CLOSE(tmp)
  1448.  IF EXISTS(tempfile) THEN IF reqfile = 0 THEN DELETE(tempfile)
  1449.  IF (progressid ~= 0) & SYMBOL('progressid') = 'VAR' THEN DO
  1450.    ADDRESS(thorport)
  1451.    'CLOSEPROGRESS REQ' progressid
  1452.  END
  1453.  IF (progressid1 ~= 0) & SYMBOL('progressid1') = 'VAR' THEN DO
  1454.    ADDRESS(thorport)
  1455.    'CLOSEPROGRESS REQ' progressid1
  1456.  END
  1457.  IF (pbsave ~= 0) & SYMBOL('pbsave') = 'VAR' THEN DO
  1458.    ADDRESS(thorport)
  1459.    'CLOSEPROGRESS REQ' pbsave
  1460.  END
  1461. EXIT
  1462. /*~!*/
  1463. /*~!*/
  1464.  
  1465.